﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace WebUtil.CSharp
{
    #region Dispose模式 
    /// <summary>
    /// 当使用到unmemory resouces的时候, 需要使用此模式
    /// dispose不用说了, 标准用法, finilizer是被动防御, 防止忘记调用dispose
    /// 注意: 自定义类的dispose方法要程序员去手动控制调用, 系统不会调用
    /// </summary>
    public class MyFatherClass : IDisposable
    {
        private bool isAlreadyDisposed = false;
        //接口方法, 系统调用, 用来回收资源
        public void Dispose() {
            //这里是真正在处理对象, 真正在disposing, 所以为true, 但还不是实际操作的地方, 实际操作
            //放在虚函数Dispose里面, 这样给子类一个入口可以控制他们自己的dispose资源
            Dispose(true);
            //告诉GC, 这个对象已经被我处理了, 不用你管了
            GC.SuppressFinalize(true);
        }

        //虚函数,子类入口,dispose的真正实现位置
        public virtual void Dispose(bool isDisposing) {
            if (isAlreadyDisposed)
                return;
            if (isDisposing)
            {
                //释放资源(释放托管代码), 实现了IDispose接口以为着自己去处理释放资源, 没GC什么事了, 所以啥资源都要处理
                ;
            }
            //释放非托管代码, 啥资源都要处理
            ;
            isAlreadyDisposed = true;
        }

        //finilizer, 这里的作用就是一个防御机制, 防止用户忘记调用dispose造成资源没有被释放
        ~MyFatherClass()
        {
            Dispose(false);
        }
    }

    public class MySonClass : MyFatherClass {
        private bool isAlreadyDisposed = false;
        public override void Dispose(bool isDisposing)
        {
            //注意这里, 子类自己释放时一定要记的释放父类的资源
            base.Dispose(isDisposing);
            //然后再进行自己的释放行为
            if (isAlreadyDisposed)
                return;
            if (isDisposing)
            {
                //释放资源
            }
            isAlreadyDisposed = true;
        }
    }

    #endregion

    #region 处理Js和css的缓存问题
    //1:reference:http://omaralzabir.com/automatic-javascript-css-versioning-to-refresh-browser-cache/
    // http://www.codeproject.com/Articles/203288/Automatic-JS-CSS-versioning-to-update-browser-cach
    //Here’s an HttpFilter that can do that for you. This filter intercepts any ASPX hit and then it 
    //automatically appends the last modification date time of javascript and css files inside the emitted html. 
    //It does so without storing the whole generated html in memory nor doing any string operation because that will cause high memory 
    //and CPU consumption on webserver under high load. The code works with character buffers and response streams directly so that it’s as fast as possible. 
    //I have done enough load test to ensure even if you hit an aspx page million times per hour, it won’t add more than 50ms delay over each page response time.
    //First, you add set the filter called StaticContentFilter in the Global.asax file’s Application_BeginRequest event handler:

    //Response.Filter = new Dropthings.Web.Util.StaticContentFilter(
    //    Response,
    //    relativePath =>
    //      {
    //        if (Context.Cache[physicalPath] == null)
    //        {
    //          var physicalPath = Server.MapPath(relativePath);
    //          var version = "?v=" +
    //            new System.IO.FileInfo(physicalPath).LastWriteTime
    //            .ToString("yyyyMMddhhmmss");
    //          Context.Cache.Add(physicalPath, version, null,
    //            DateTime.Now.AddMinutes(1), TimeSpan.Zero,
    //            CacheItemPriority.Normal, null);
    //          Context.Cache[physicalPath] = version;
    //          return version;
    //        }
    //        else
    //        {
    //          return Context.Cache[physicalPath] as string;
    //        }
    //      },
    //    "http://images.mydomain.com/",
    //    "http://scripts.mydomain.com/",
    //    "http://styles.mydomain.com/",
    //    baseUrl,
    //    applicationPath,
    //    folderPath);
    //}
    //2:Squishit http://www.codethinked.com/squishit-the-friendly-aspnet-javascript-and-css-squisher
    //3:IIS 设置 http://www.hanselman.com/blog/ForcingAnUpdateOfACachedJavaScriptFileInIIS.aspx
    #endregion

    #region Application, Cookie, Session
    //Ref:http://hi.baidu.com/baobao_wawa/blog/item/a4b14434d77a114b241f1447.html
    //无意间在网上看到讲述三者各自作用范围的一段话，感觉不错 呵呵 所以收藏下来！

    //COOKIE 是本地文件，是40大盗在阿里巴巴家做的记号，或者是送牛奶的人在你家门口钉的箱子。

    //SESSION 是服务器端内存，是你洗澡时浴池发给你的钥匙。自己专用，可以开自己的好多箱子。

    //APPLICATION 是公共浴池。在这里能看见所有人，包括 ppmm 喔

    //通过我们现实中的事物来讲述三者各自的作用范围 我想对于初学者而言可以更直观的了解它们。这样就可以根据自己的项目有针对性的来选择和使用它们了，
    //至于使用方法可以在上网搜到 这种入门级的东西一搜一大堆滴！

    //-----------------------------------------------------------------------------------------------------------------------------------

    //网上关于Session是否会随着浏览器关闭而销毁问题的争议好像很大嘛！下面就说说Session在什么情况下才会销毁。
    //NND在CSDN上竟然看到有人说cookie和session都可以放在服务端也可以放在客户端 我就日了他还真能说的出口，我都替那哥们脸红。OK下面进入正题

    //session死亡 发生在以下情况: 
    //1.session的持有者(即客户端浏览器)在最大无活动等待时间(MaxInactiveInterval)内无任何响应或请求 
    //2.session被调用invalidate()方法强制销毁了 
    //3.服务器重起或发生中断(此时应该是所有在服务器上的session全都OVER了)   

    //用户关闭浏览器后标志着 
    //a.session将无法再发送请求到服务器【除非通过非法手段操作没有被销毁的Session来给服务器发送请求】
    //b.该session将不会有人调用他的invalidate()方法 
    //所以，此时只能等待session自己超时死亡，如果设置了该session的MaxInactiveInterval为-1,那么这个session只有在第3种情况下才能死了.

    //看到网上太多的人说浏览器关闭=session死亡。我就很纳闷这些人也能出来写代码真是奇迹了。我们可以用最简单直接的形式来查看当浏览器关闭Session到底有没有一起销毁。
    //使用HttpSessionListener 接口来监听session的一举一动包括它的创建和销毁。结果自己一看就知道了。
    //在说了用脑袋稍微想一想也不太现实,session是存放在服务器内存中的，当客户端没有发送任何请求给服务端的时候 服务端怎么会知道客户端的浏览器已经关闭？ 
    //更不可能跟随客户端浏览器的关闭而一起销毁了。这种说法简直是笑话！纯粹误导新手
    #endregion
}